package com.cyh.StaticDispatch_DinamicDispatch;

/**
 * Created by yanhuche on 3/20/2017.
 */
public class StaticDispatch {

    static abstract class Human {
    }

    static class Man extends Human {
    }

    static class Woman extends Human {
    }

    public void sayHello(Human guy) {
        System.out.println("hello,guy!");
    }

    public void sayHello(Man guy) {
        System.out.println("hello,gentleman!");
    }

    public void sayHello(Woman guy) {
        System.out.println("hello,lady!");
    }

    public static void main(String[] args) {
        Human man = new Man();
        Human woman = new Woman();
        StaticDispatch sr = new StaticDispatch();
        sr.sayHello(man);
        sr.sayHello(woman);
    }
}


/**
 * Human被称为静态类型，Man被称为实际类型
 * 静态类型的变化仅仅是在使用时发生，变量本身的静态类型不会被改变，并且静态类型最终是在编译期可知的；
 * 而实际类型变化的结果在运行期才可确定，编译器在编译程序的时候并不知道一个对象的实际类型是什么。
 *
 * VM（准确说是编译器）在重载是通过参数的静态类型耍不是实际类型来作为判定依据的。
 *
 * 并且静态类型是编译期可知的，故在编译阶段，编译器会根据参数的静态类型来决定使用哪个重载版本。
 *
 * 静态分配
 *
 * 重载
 */